/**
 * 地理位置工具类
 * 用于获取用户的地理位置信息
 */

/**
 * 使用浏览器Geolocation API获取位置（需要HTTPS和用户授权）
 * @returns {Promise<Object>} 包含省份、城市等信息
 */
export async function getBrowserLocation() {
  if (!navigator.geolocation) {
    throw new Error('浏览器不支持地理位置服务')
  }

  return new Promise((resolve, reject) => {
    navigator.geolocation.getCurrentPosition(
      async (position) => {
        const { latitude, longitude } = position.coords
        
        try {
          // 使用逆地理编码获取地址信息
          const location = await reverseGeocode(latitude, longitude)
          resolve(location)
        } catch (error) {
          reject(error)
        }
      },
      (error) => {
        console.error('获取地理位置失败:', error)
        reject(new Error('无法获取地理位置，请检查浏览器权限设置'))
      },
      {
        enableHighAccuracy: false,
        timeout: 5000,
        maximumAge: 300000 // 缓存5分钟
      }
    )
  })
}

/**
 * 使用IP地址获取大概位置（无需用户授权，推荐）
 * @returns {Promise<Object>} 包含省份、城市等信息
 */
export async function getLocationByIP() {
  try {
    // 使用多个免费API，提高成功率
    const apis = [
      // API 1: ip-api.com (免费，无需key)
      {
        url: 'http://ip-api.com/json/?lang=zh-CN',
        parser: (data) => ({
          country: data.country,
          province: data.regionName,
          city: data.city,
          location: data.regionName || data.country
        })
      },
      // API 2: ipapi.co (免费，无需key)
      {
        url: 'https://ipapi.co/json/',
        parser: (data) => ({
          country: data.country_name,
          province: data.region,
          city: data.city,
          location: data.region || data.country_name
        })
      }
    ]

    // 尝试第一个API
    for (const api of apis) {
      try {
        const response = await fetch(api.url)
        const data = await response.json()
        const location = api.parser(data)
        
        if (location.location) {
          console.log('成功获取地理位置:', location)
          return location
        }
      } catch (error) {
        console.warn(`API ${api.url} 失败:`, error)
        continue
      }
    }

    // 所有API都失败，返回默认值
    return {
      country: '中国',
      province: null,
      city: null,
      location: '中国'
    }
  } catch (error) {
    console.error('获取IP位置失败:', error)
    return {
      country: '中国',
      province: null,
      city: null,
      location: '中国'
    }
  }
}

/**
 * 逆地理编码：将经纬度转换为地址
 * @param {number} lat 纬度
 * @param {number} lng 经度
 * @returns {Promise<Object>}
 */
async function reverseGeocode(lat, lng) {
  try {
    // 使用高德地图API（免费，需要申请key）
    // 如果没有key，可以使用其他服务
    const key = 'YOUR_AMAP_KEY' // 需要替换为实际的key
    
    const response = await fetch(
      `https://restapi.amap.com/v3/geocode/regeo?key=${key}&location=${lng},${lat}&extensions=base`
    )
    const data = await response.json()
    
    if (data.status === '1' && data.regeocode) {
      const addressComponent = data.regeocode.addressComponent
      return {
        country: '中国',
        province: addressComponent.province,
        city: addressComponent.city,
        location: addressComponent.province
      }
    }
    
    throw new Error('逆地理编码失败')
  } catch (error) {
    console.error('逆地理编码失败:', error)
    // 如果逆地理编码失败，降级使用IP定位
    return await getLocationByIP()
  }
}

/**
 * 获取用户位置（优先使用IP定位，快速且无需授权）
 * @returns {Promise<string>} 位置字符串，如"四川省"、"北京市"
 */
export async function getUserLocation() {
  try {
    const locationData = await getLocationByIP()
    
    // 格式化位置字符串
    if (locationData.province) {
      // 如果省份不包含"省"或"市"后缀，自动添加
      const province = locationData.province
      if (!province.endsWith('省') && !province.endsWith('市') && !province.endsWith('区')) {
        return `${province}省`
      }
      return province
    }
    
    return locationData.location || '中国'
  } catch (error) {
    console.error('获取用户位置失败:', error)
    return '中国'
  }
}

/**
 * 简化的位置获取（用于显示）
 * @returns {Promise<string>}
 */
export async function getSimpleLocation() {
  const location = await getUserLocation()
  
  // 简化显示，去掉"省"、"市"等后缀
  return location
    .replace('省', '')
    .replace('市', '')
    .replace('自治区', '')
    .replace('特别行政区', '')
}

/**
 * 检查是否有缓存的位置信息
 * @returns {string|null}
 */
export function getCachedLocation() {
  const cached = localStorage.getItem('userLocation')
  if (cached) {
    const data = JSON.parse(cached)
    const now = Date.now()
    // 缓存7天
    if (now - data.timestamp < 7 * 24 * 60 * 60 * 1000) {
      return data.location
    }
  }
  return null
}

/**
 * 缓存位置信息
 * @param {string} location
 */
export function cacheLocation(location) {
  localStorage.setItem('userLocation', JSON.stringify({
    location,
    timestamp: Date.now()
  }))
}

/**
 * 获取位置（优先使用缓存）
 * @returns {Promise<string>}
 */
export async function getLocationWithCache() {
  // 先检查缓存
  const cached = getCachedLocation()
  if (cached) {
    return cached
  }
  
  // 获取新位置并缓存
  const location = await getUserLocation()
  cacheLocation(location)
  return location
}

